// 广告轮播的实际逻辑

#include "../inc/ad_carousel.h"
#include "../output/ui.h"
#include <stdio.h> // 用于printf调试输出

// 广告图片数组：存放所有要轮播的图片资源指针。
// 这些是 SquareLine Studio 导入图片后在 ui_images.h 中生成的 lv_img_dsc_t 变量。
// 请确保这里的图片变量名与您在 SquareLine Studio 中导入并生成的图片变量名一致。
static const lv_img_dsc_t * ad_images[] = {
    &ui_img_634216573,  // 第一张广告图片变量名
    &ui_img_1715945752, // 第二张
    &ui_img_1497292365, // 第三张
};

// 广告图片数量：根据数组自动计算，无需手动修改。
static const int NUM_AD_IMAGES = sizeof(ad_images) / sizeof(ad_images[0]);
// 当前显示的广告图片索引：用于跟踪当前是哪一张图片。
static int current_ad_image_index = 0;
// 广告轮播定时器：LVGL 定时器对象的指针。
static lv_timer_t * ad_carousel_timer = NULL;
// 广告图片显示对象：用于在定时器回调中更新图片。
static lv_obj_t * global_ad_image_obj = NULL;

/**
 * @brief 广告图片轮播定时器回调函数。
 * 此函数会在定时器周期性触发时被调用，用于切换广告图片。
 * @param timer LVGL定时器对象，这里不需要使用其内部数据，所以参数类型为 lv_timer_t *。
 */
static void ad_carousel_timer_cb(lv_timer_t * timer)
{
    // 递增图片索引，使用模运算实现循环轮播（当达到数组末尾时，回到数组开头）。
    current_ad_image_index = (current_ad_image_index + 1) % NUM_AD_IMAGES;

    // 更新广告图片对象的图片源。
    // 确保 global_ad_image_obj 对象存在，以避免空指针解引用。
    if(global_ad_image_obj) 
    {
        lv_img_set_src(global_ad_image_obj, ad_images[current_ad_image_index]);
    }
}

/**
 * @brief 启动广告图片轮播。
 * 此函数会初始化广告图片数组，并创建一个LVGL定时器来周期性切换图片。
 * @param ad_image_obj 用于显示广告的LVGL图片对象指针。
 */
void start_ad_carousel(lv_obj_t * ad_image_obj)
{
    if(ad_image_obj == NULL) {
        printf("错误：启动广告轮播时 ad_image_obj 为 NULL。\n");
        fflush(stdout);
        return;
    }

    global_ad_image_obj = ad_image_obj; // 保存图片对象指针

    // 初始化显示第一张广告图片
    current_ad_image_index = 0;
    lv_img_set_src(global_ad_image_obj, ad_images[current_ad_image_index]);

    // 创建并启动广告轮播定时器。
    // 轮播间隔设置为 5000 毫秒
    // 使用 if 语句检查定时器是否已存在，防止重复创建。
    if(ad_carousel_timer == NULL) {
        ad_carousel_timer = lv_timer_create(ad_carousel_timer_cb, 5000, NULL);
        printf("广告轮播定时器已启动。\n");
        fflush(stdout);
    } else {
        // 如果定时器已经存在，可以考虑重置它或者直接返回
        printf("广告轮播定时器已在运行，无需重复启动。\n");
        fflush(stdout);
    }
}

/**
 * @brief 停止广告图片轮播。
 * 此函数会停止并删除LVGL定时器，释放相关资源。
 */
void stop_ad_carousel(void)
{
    if(ad_carousel_timer) {
        lv_timer_del(ad_carousel_timer); // 删除定时器
        ad_carousel_timer   = NULL;      // 清空指针，表示定时器已不存在
        global_ad_image_obj = NULL;      // 清空图片对象指针
        printf("广告轮播定时器已停止并删除。\n");
        fflush(stdout);
    }
}
